<?php

App::import('Sanitize');

class ObrasController extends AppController {

    var $name = 'Obras';
    var $paginate = array(
        'recursive' => 0,
        'order' => array('Obra.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        //$this->Auth->allow();
    }

    function add_obra() {
        $this->__aux_add_obra();
    }

    function admin_add_obra() {
        $this->__aux_add_obra();
    }

    /**
     * Contiene la vista con las solapas para dar de alta una nueva obra de arte
     */
    function __aux_add_obra() {
        if ($this->Session->check('id_obra'))
            $this->Session->delete('id_obra');

        if ($this->Session->check('id_evaluacione'))
            $this->Session->delete('id_evaluacione');

        if ($this->Session->check('id_intervencione'))
            $this->Session->delete('id_intervencione');
        
        $this->render('add_obra');
    }

    function add_datos_generales() {
        $this->__aux_add_datos_generales();
    }

    function admin_add_datos_generales() {
        $this->__aux_add_datos_generales();
    }

    /**
     * Permite dar de alta una nueva obra de arte (puente o alcantarilla)
     */
    function __aux_add_datos_generales() {
        $this->layout = false;

        $obrasTipos = $this->Obra->ObrasTipo->find('list', array('fields' => array('ObrasTipo.id', 'ObrasTipo.nombre'), 'order' => 'ObrasTipo.nombre'));
        $obras_tipo_id = 0;
        $codigo_identificacion = '';
        $nombre = '';
        $niveles = $this->Obra->Nivele->find('list', array('fields' => array('Nivele.id', 'Nivele.nivel_servicio'), 'order' => 'Nivele.nivel_servicio'));
        $nivele_id = 0;

        $provincias = $this->Provincia->find('list', array('fields' => array('Provincia.id', 'Provincia.nombre'), 'order' => 'Provincia.nombre'));
        $provincia_id = '';
        $departamentos = array();
        $departamento_id = '';
        $localidades = array();
        $localidade_id = '';

        $tramos = 0;
        $luz_total = 0;
        $tramos_obra = '';
        $zonas = $this->Obra->Zona->find('list', array('fields' => array('Zona.id', 'Zona.nombre'), 'order' => 'Zona.nombre'));
        $zona_id = '';
        $rutas = $this->Obra->Ruta->find('list', array('fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
        $ruta_id = '';
        $ruta_tramo = '';
        $progresiva = '';
        $obstaculos = $this->Obra->Obstaculo->find('list', array('fields' => array('Obstaculo.id', 'Obstaculo.nombre'), 'order' => 'Obstaculo.nombre'));
        $obstaculo_id = '';
        $coordenada_x = '';
        $coordenada_y = '';
        $ancho_calzada = '';
        $carriles = '';
        $sobrecarga_admisible = '';
        $tmda = '';
        $tipos = array('Simple' => 'Simple', 'Mixto' => 'Mixto');
        $id_tipo_material = '';
        $materiales = $this->Materiale->find('list', array('fields' => array('Materiale.id', 'Materiale.nombre'), 'order' => 'Materiale.nombre'));
        $materiale_id = '';
        $secundario = '';
        $tipos_estructurales = array();
        $tipos_estructurale_id = '';
        $clases_transitos = array();
        $clases_transito_id = '';
        $clases_posicion = array('Lateral' => 'Lateral', 'Transversal' => 'Transversal');
        $clase_posicion_id = '';
        $responsable_proyecto = '';
        $empresa_constructora = '';
        $fecha_proyecto = '';
        $fecha_inicio = '';
        $fecha_fin = '';
        $fecha_habilitacion = '';

        $hidden_obra_id = '';
        $hidden_materiales_tipo_id = '';
        $hidden_datos_construccione_id = '';


        if (!empty($this->data)) {
            $this->__save_datos_generales($this->data);
        } elseif ($this->Session->check('id_obra')) {
            $id_obra = $this->Session->read('id_obra');
            $this->Obra->recursive = 0;
            $this->Obra->id = $id_obra;
            $obra = $this->Obra->read();

            if (!empty($obra)) {
                $hidden_obra_id = "<input type='hidden' id='ObraId' name='data[Obra][id]' value='" . $id_obra . "'>";
                $obras_tipo_id = $obra['ObrasTipo']['id'];
                $codigo_identificacion = $obra['Obra']['codigo_identificacion'];
                $nombre = $obra['Obra']['nombre'];
                $nivele_id = $obra['Obra']['nivele_id'];

                $localidade_id = $obra['Localidade']['id'];
                $departamento_id = $obra['Localidade']['departamento_id'];
                $localidades = $this->Obra->Localidade->find('list', array('conditions' => array('Localidade.departamento_id' => $departamento_id), 'fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));

                $this->Departamento->recursive = -1;
                $provincia = $this->Departamento->findById($departamento_id);
                if (!empty($provincia)) {
                    $provincia_id = $provincia['Departamento']['provincia_id'];
                    $departamentos = $this->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id), 'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
                }

                $x = $this->Obra->query('SELECT X(AsText(obra_geom)) FROM obras WHERE id=' . $id_obra . ';');
                $y = $this->Obra->query('SELECT Y(AsText(obra_geom)) FROM obras WHERE id=' . $id_obra . ';');
                $coordenada_x = (!empty($x)) ? $x[0][0]['x'] : '';
                $coordenada_y = (!empty($y)) ? $y[0][0]['y'] : '';

                $this->Tramo->recursive = -1;
                $set_tramos = $this->Tramo->find('all', array('conditions' => array('Tramo.obra_id' => $id_obra)));
                if (!empty($set_tramos)) {
                    $tramos = count($set_tramos);
                    foreach ($set_tramos as $key => $tramo) {
                        $luz_total += $tramo['Tramo']['luz_parcial'];
                        $tramos_obra .= "<div id='div_" . $key . "' name='div_" . $key . "'><label>Luz Parcial Tramo " . $key . "</label><input id='tramo_" . $key . "' name='data[Tramo][tramo_" . $key . "]' value='" . $tramo['Tramo']['luz_parcial'] . "' onchange='convertiraFloat(this); sumarLongitudTotal();'></div>";
                    }
                }

                $zona_id = $obra['Zona']['id'];
                $ruta_id = $obra['Ruta']['id'];
                $ruta_tramo = $obra['Obra']['ruta_tramo'];
                $progresiva = $obra['Obra']['progresiva'];
                $obstaculo_id = $obra['Obstaculo']['id'];
                $ancho_calzada = $obra['Obra']['ancho_calzada'];
                $carriles = $obra['Obra']['carriles'];
                $sobrecarga_admisible = $obra['Obra']['sobrecarga_admisible'];
                $tmda = $obra['Obra']['tmda'];

                $hidden_materiales_tipo_id = "<input type='hidden' id='MaterialesTipoId' name='data[MaterialesTipo][id]' value='" . $obra['MaterialesTipo']['id'] . "'>";
                $id_tipo_material = $obra['MaterialesTipo']['tipo'];
                $materiale_id = $obra['MaterialesTipo']['materiale_id'];
                if ($id_tipo_material == 'Mixto') {
                    $secundario = $obra['MaterialesTipo']['secundario'];
                }

                $tipos_estructurales = $this->Obra->TiposEstructurale->find('list', array('conditions' => array('TiposEstructurale.obras_tipo_id' => $obra['ObrasTipo']['id']), 'fields' => array('TiposEstructurale.id', 'TiposEstructurale.nombre'), 'order' => 'TiposEstructurale.nombre'));
                $tipos_estructurale_id = $obra['TiposEstructurale']['id'];
                $clases_transitos = $this->Obra->ClasesTransito->find('list', array('conditions' => array('ClasesTransito.obras_tipo_id' => $obra['ObrasTipo']['id']), 'fields' => array('ClasesTransito.id', 'ClasesTransito.nombre'), 'order' => 'ClasesTransito.nombre'));
                $clases_transito_id = $obra['ClasesTransito']['id'];
                if ($obra['ObrasTipo']['id'] == 2) {
                    $clase_posicion_id = $obra['Obra']['clase_posicion'];
                }

                $hidden_datos_construccione_id = "<input type='hidden' id='DatosConstruccioneId' name='data[DatosConstruccione][id]' value='" . $obra['DatosConstruccione']['id'] . "'>";
                $responsable_proyecto = $obra['DatosConstruccione']['responsable_proyecto'];
                $empresa_constructora = $obra['DatosConstruccione']['empresa_constructora'];
                $fecha_proyecto = date('d/m/Y', strtotime($obra['DatosConstruccione']['fecha_proyecto']));
                $fecha_inicio = date('d/m/Y', strtotime($obra['DatosConstruccione']['fecha_inicio']));
                $fecha_fin = date('d/m/Y', strtotime($obra['DatosConstruccione']['fecha_fin']));
                $fecha_habilitacion = date('d/m/Y', strtotime($obra['DatosConstruccione']['fecha_habilitacion']));
            }
        }
        $referer = $this->referer();
        $this->set(compact('obras_tipo_id', 'codigo_identificacion', 'nombre', 'nivele_id', 'provincia_id', 'departamento_id', 'localidade_id', 'tramos', 'luz_total', 'zona_id', 'ruta_id', 'ruta_tramo', 'progresiva', 'obstaculo_id', 'coordenada_x', 'coordenada_y', 'ancho_calzada', 'carriles', 'sobrecarga_admisible', 'tmda', 'id_tipo_material', 'materiale_id', 'secundario', 'tipos_estructurale_id', 'clases_transito_id', 'clase_posicion_id', 'responsable_proyecto', 'empresa_constructora', 'fecha_proyecto', 'fecha_inicio', 'fecha_fin', 'fecha_habilitacion'));
        $this->set(compact('obrasTipos', 'niveles', 'provincias', 'departamentos', 'localidades', 'zonas', 'rutas', 'obstaculos', 'tipos', 'materiales', 'tipos_estructurales', 'clases_transitos', 'clases_posicion', 'datosConstrucciones', 'clasesTransitos', 'tiposEstructurales', 'tramos_obra'));
        $this->set(compact('hidden_obra_id', 'hidden_materiales_tipo_id', 'hidden_datos_construccione_id', 'referer'));
        $this->render('add_datos_generales');
    }

    function view_departamentos($provincia_id = null) {
        $this->__aux_view_departamentos($provincia_id);
    }

    function admin_view_departamentos($provincia_id = null) {
        $this->__aux_view_departamentos($provincia_id);
    }

    /**
     *
     * @param <type> $provincia_id
     */
    function __aux_view_departamentos($provincia_id = null) {
        $this->layout = false;
        $departamentos = array();
        $departamento_id = 0;
        if (!empty($provincia_id)) {
            $departamentos = $this->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id), 'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
        }

        $this->set(compact('departamentos', 'departamento_id', 'provincia_id'));
        $this->render('view_departamentos');
    }

    function view_localidades($departamento_id = null) {
        $this->__aux_view_localidades($departamento_id);
    }

    function admin_view_localidades($departamento_id = null) {
        $this->__aux_view_localidades($departamento_id);
    }

    /**
     *
     * @param <type> $departamento_id
     */
    function __aux_view_localidades($departamento_id = null) {
        $this->layout = false;
        $localidades = array();
        $localidad_id = 0;
        if (!empty($departamento_id)) {
            $localidades = $this->Localidade->find('list', array('conditions' => array('Localidade.departamento_id' => $departamento_id), 'fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));
        }
        $this->set(compact('localidades', 'departamento_id', 'provincia_id'));
        $this->render('view_localidades');
    }

    function view_tipos_materiales($materiales_tipo_id = null) {
        $this->__aux_view_tipos_materiales($materiales_tipo_id);
    }

    function admin_view_tipos_materiales($materiales_tipo_id = null) {
        $this->__aux_view_tipos_materiales($materiales_tipo_id);
    }

    /**
     *
     * @param <type> $materiales_tipo_id = (Simple o Mixto)
     */
    function __aux_view_tipos_materiales($materiales_tipo_id = null) {
        $this->layout = false;
        $materiales = array();

        if (!empty($materiales_tipo_id)) {
            $materiales = $this->Materiale->find('list', array('fields' => array('Materiale.id', 'Materiale.nombre'), 'order' => 'Materiale.nombre'));
        }
        $this->set(compact('materiales_tipo_id', 'materiales'));
        $this->render('view_tipos_materiales');
    }

    function view_tipologias($obras_tipo_id = null) {
        $this->__aux_view_tipologias($obras_tipo_id);
    }

    function admin_view_tipologias($obras_tipo_id = null) {
        $this->__aux_view_tipologias($obras_tipo_id);
    }

    /**
     *
     * @param <type> $obras_tipo_id
     */
    function __aux_view_tipologias($obras_tipo_id = null) {
        $this->layout = false;
        $tipos_estructurales = array();
        $clases_transitos = array();
        $clases_posicion = array();

        if (!empty($obras_tipo_id)) {
            $tipos_estructurales = $this->Obra->TiposEstructurale->find('list', array('conditions' => array('TiposEstructurale.obras_tipo_id' => $obras_tipo_id), 'fields' => array('TiposEstructurale.id', 'TiposEstructurale.nombre'), 'order' => 'TiposEstructurale.nombre'));

            $clases_transitos = $this->Obra->ClasesTransito->find('list', array('conditions' => array('ClasesTransito.obras_tipo_id' => $obras_tipo_id), 'fields' => array('ClasesTransito.id', 'ClasesTransito.nombre'), 'order' => 'ClasesTransito.nombre'));

            if ($obras_tipo_id == 2) {
                $clases_posicion = array('Lateral' => 'Lateral', 'Transversal' => 'Transversal');
            }
        }
        $this->set(compact('obras_tipo_id', 'tipos_estructurales', 'clases_transitos', 'clases_posicion'));
        $this->render('view_tipologias');
    }

    function view_obras() {
        $this->__aux_view_obras();
    }

    function admin_view_obras() {
        $this->__aux_view_obras();
    }

    function __aux_view_obras() {
        $this->paginate['Obra']['fields'] = array('Obra.id', 'Obra.nombre', 'Obra.localidade_id', 'Obra.codigo_identificacion', 'Obra.ruta_tramo', 'Obra.progresiva', 'Obra.habilitada', 'Obra.obras_tipo_id', 'ObrasTipo.nombre', 'Ruta.id', 'Ruta.nombre', 'Localidad.id', 'Localidad.nombre', 'Localidad.departamento_id', 'Departamento.id', 'Departamento.nombre', 'Provincia.id', 'Provincia.nombre');
        $this->paginate['Obra']['joins'] = array(
            array(
                'table' => '"localidades"',
                'type' => 'INNER',
                'alias' => 'Localidad',
                'conditions' => array(
                    'Localidad.id=Obra.localidade_id'
                )
            ),
            array(
                'table' => '"departamentos"',
                'type' => 'INNER',
                'alias' => 'Departamento',
                'conditions' => array(
                    'Departamento.id=Localidad.departamento_id'
                )
            ),
            array(
                'table' => '"provincias"',
                'type' => 'INNER',
                'alias' => 'Provincia',
                'conditions' => array(
                    'Provincia.id=Departamento.provincia_id'
                )
            )
        );

        if ($this->Session->check('id_obra'))
            $this->Session->delete('id_obra');

        if ($this->Session->check('id_evaluacione'))
            $this->Session->delete('id_evaluacione');

        if ($this->Session->check('id_intervencione'))
            $this->Session->delete('id_intervencione');

        $obrasTipos = $this->Obra->ObrasTipo->find('list', array('fields' => array('ObrasTipo.id', 'ObrasTipo.nombre'), 'order' => 'ObrasTipo.nombre'));
        $obrasTipos['0'] = 'Todas';
        $obras_tipo_id = '';

        $nombres_obras = array();
        $nombre = '';

        $habilitadas = array('0' => 'Inhabilitado', '1' => 'Habilitado');
        $habilitada_id = '';

        $provincias = $this->Provincia->find('list', array('fields' => array('Provincia.id', 'Provincia.nombre'), 'order' => 'Provincia.nombre'));
        $provincias['0'] = 'Todas';
        $provincia_id = '';

        $departamentos = array();
        $departamento_id = '';
        $localidades = array();
        $localidade_id = '';

        $descripcion = '';

        $condiciones = array();
        //si vienen datos del filtro
        if (!empty($this->data)) {
            if (isset($this->data['Obra']['obras_tipo_id']) && !empty($this->data['Obra']['obras_tipo_id'])) {
                $condiciones[] = "Obra.obras_tipo_id = {$this->data['Obra']['obras_tipo_id']}";
            }
            if (isset($this->data['Obra']['obras_tipo_id']) && (!empty($this->data['Obra']['obras_tipo_id']) || ($this->data['Obra']['obras_tipo_id'] == '0'))) {
                $obras_tipo_id = $this->data['Obra']['obras_tipo_id'];
                $this->Session->write('obras_tipo_id', $obras_tipo_id);
            }

            if (isset($this->data['Obra']['nombre']) && !empty($this->data['Obra']['nombre'])) {
                $condiciones[] = "Obra.id = {$this->data['Obra']['nombre']}";
            }

            if (isset($this->data['Obra']['nombre']) && (!empty($this->data['Obra']['nombre']) || ($this->data['Obra']['nombre'] == '0'))) {
                $nombre = $this->data['Obra']['nombre'];
                if (!empty($this->data['Obra']['obras_tipo_id'])) {
                    $nombres_obras = $this->Obra->find('list', array('conditions' => array('Obra.obras_tipo_id' => $this->data['Obra']['obras_tipo_id']),
                                'fields' => array('Obra.id', 'Obra.nombre'), 'order' => 'Obra.nombre'));
                } else {
                    $nombres_obras = $this->Obra->find('list', array('fields' => array('Obra.id', 'Obra.nombre'), 'order' => 'Obra.nombre'));
                }
                $nombres_obras['0'] = 'Todos';

                $this->Session->write('nombre', $nombre);
                $this->Session->write('nombres_obras', $nombres_obras);
            }

            if (isset($this->data['Obra']['habilitada_id']) && (!empty($this->data['Obra']['habilitada_id']) || ($this->data['Obra']['habilitada_id'] == '0'))) {
                $condiciones[] = "Obra.habilitada = {$this->data['Obra']['habilitada_id']}";
            }
            if (isset($this->data['Obra']['habilitada_id']) && (!empty($this->data['Obra']['habilitada_id']) || ($this->data['Obra']['habilitada_id'] == '0'))) {
                $habilitada_id = $this->data['Obra']['habilitada_id'];
                $this->Session->write('habilitada_id', $habilitada_id);
            }

            if (isset($this->data['Obra']['provincia_id']) && !empty($this->data['Obra']['provincia_id'])) {
                $condiciones[] = "Provincia.id = {$this->data['Obra']['provincia_id']}";
            }

            if (isset($this->data['Obra']['provincia_id']) && (!empty($this->data['Obra']['provincia_id']) || ($this->data['Obra']['provincia_id'] == '0'))) {
                $provincia_id = $this->data['Obra']['provincia_id'];
                $this->Session->write('provincia_id', $provincia_id);
            }

            if (isset($this->data['Obra']['departamento_id']) && !empty($this->data['Obra']['departamento_id'])) {
                $condiciones[] = "Departamento.id = {$this->data['Obra']['departamento_id']}";
            }

            if (isset($this->data['Obra']['departamento_id']) && (!empty($this->data['Obra']['departamento_id']) || ($this->data['Obra']['departamento_id'] == '0'))) {
                $departamento_id = $this->data['Obra']['departamento_id'];
                if (!empty($this->data['Obra']['provincia_id'])) {
                    $departamentos = $this->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $this->data['Obra']['provincia_id']),
                                'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
                } else {
                    $departamentos = $this->Departamento->find('list', array('fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
                }
                $departamentos['0'] = 'Todos';

                $this->Session->write('departamento_id', $departamento_id);
                $this->Session->write('departamentos', $departamentos);
            }

            if (isset($this->data['Obra']['localidade_id']) && !empty($this->data['Obra']['localidade_id'])) {
                $condiciones[] = "Localidad.id = {$this->data['Obra']['localidade_id']}";
            }

            if (isset($this->data['Obra']['localidade_id']) && (!empty($this->data['Obra']['localidade_id']) || ($this->data['Obra']['localidade_id'] == '0'))) {
                $localidade_id = $this->data['Obra']['localidade_id'];
                if (!empty($this->data['Obra']['departamento_id'])) {
                    $localidades = $this->Localidade->find('list', array('conditions' => array('Localidade.departamento_id' => $this->data['Obra']['departamento_id']),
                                'fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));
                } else {
                    $localidades = $this->Localidade->find('list', array('fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));
                }
                $localidades['0'] = 'Todas';
                $this->Session->write('localidade_id', $localidade_id);
                $this->Session->write('localidades', $localidades);
            }

            if (isset($this->data['Obra']['descripcion']) && !empty($this->data['Obra']['descripcion'])) {
                $descripcion = utf8_encode(strtolower(utf8_decode(trim($this->data['Obra']['descripcion']))));
                $condiciones[] = "lower(Obra.nombre) LIKE '%{$descripcion}%'";
                $this->Session->write('descripcion', $this->data['Obra']['descripcion']);
            }

            $this->Session->write('obras_filter', $condiciones);
        } elseif ($this->Session->check('obras_filter')) {//si tengo cargado un filtro en session
            //me fijo si esta cambiando de pagina o cambiando el limit
            if (isset($this->params['named']['limit']) || isset($this->params['named']['page'])) {
                //si ya estaba siendo aplicado un filtro, lo sigo usando
                $condiciones = $this->Session->read('obras_filter');
                $obras_tipo_id = ($this->Session->check('obras_tipo_id')) ? $this->Session->read('obras_tipo_id') : '';
                $nombres_obras = ($this->Session->check('nombres_obras')) ? $this->Session->read('nombres_obras') : array();
                $nombre = ($this->Session->check('nombre')) ? $this->Session->read('nombre') : '';
                $provincia_id = ($this->Session->check('provincia_id')) ? $this->Session->read('provincia_id') : '';
                $departamentos = ($this->Session->check('departamentos')) ? $this->Session->read('departamentos') : array();
                $departamento_id = ($this->Session->check('departamento_id')) ? $this->Session->read('departamento_id') : '';
                $localidades = ($this->Session->check('localidades')) ? $this->Session->read('localidades') : array();
                $localidade_id = ($this->Session->check('localidade_id')) ? $this->Session->read('localidade_id') : '';
                $descripcion = ($this->Session->check('descripcion')) ? $this->Session->read('descripcion') : '';
                $habilitadas = ($this->Session->check('habilitadas')) ? $this->Session->read('habilitadas') : array();
                $habilitada_id = ($this->Session->check('habilitada_id')) ? $this->Session->read('habilitada_id') : '';
            } else {
                //sino, lo borro de la session
                $this->Session->delete('obras_filter');
                $this->Session->delete('obras_tipo_id');
                $this->Session->delete('nombres_obras');
                $this->Session->delete('nombre');
                $this->Session->delete('provincia_id');
                $this->Session->delete('departamentos');
                $this->Session->delete('departamento_id');
                $this->Session->delete('localidades');
                $this->Session->delete('localidade_id');
                $this->Session->delete('descripcion');
                $this->Session->delete('habilitadas');
                $this->Session->delete('habilitada_id');
            }
        }

        $referer = $this->referer();
        $this->paginate['Obra']['conditions'] = $condiciones;
        $this->set(compact('obrasTipos', 'obras_tipo_id', 'nombres_obras', 'nombre', 'provincia_id', 'departamentos', 'departamento_id', 'localidades', 'localidade_id', 'descripcion', 'provincias', 'referer', 'habilitadas', 'habilitada_id'));
        $this->set('obras', $this->paginate('Obra'));
        $this->render('view_obras');
    }

    function view_names_obras($obras_tipo_id = null) {
        $this->__aux_view_names_obras($obras_tipo_id);
    }

    function admin_view_names_obras($obras_tipo_id = null) {
        $this->__aux_view_names_obras($obras_tipo_id);
    }

    /**
     *
     * @param <type> $obras_tipo_id
     */
    function __aux_view_names_obras($obras_tipo_id = null) {
        $this->layout = false;
        $nombres_obras = array();

        if (!empty($obras_tipo_id)) {
            $nombres_obras = $this->Obra->find('list', array('conditions' => array('Obra.obras_tipo_id' => $obras_tipo_id), 'fields' => array('Obra.id', 'Obra.nombre'), 'order' => 'Obra.nombre'));
        } else {
            $nombres_obras = $this->Obra->find('list', array('fields' => array('Obra.id', 'Obra.nombre'), 'order' => 'Obra.nombre'));
        }
        $nombres_obras[0] = 'Todos';
        $this->set(compact('obras_tipo_id', 'nombres_obras'));
        $this->render('view_names_obras');
    }

    function view_departamentos_filtro($provincia_id = null) {
        $this->__aux_view_departamentos_filtro($provincia_id);
    }

    function admin_view_departamentos_filtro($provincia_id = null) {
        $this->__aux_view_departamentos_filtro($provincia_id);
    }

    /**
     * Busca los departamentos de una determinada provincia o todos los departamentos
     * @param <type> $provincia_id
     */
    function __aux_view_departamentos_filtro($provincia_id = null) {
        $this->layout = false;
        $departamentos = array();

        if (!empty($provincia_id)) {
            $departamentos = $this->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id), 'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
        } else {
            $departamentos = $this->Departamento->find('list', array('fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
        }
        $departamentos[0] = 'Todos';
        $this->set(compact('provincia_id', 'departamentos'));
        $this->render('view_departamentos_filtro');
    }

    function view_localidades_filtro($departamento_id = null) {
        $this->__aux_view_localidades_filtro($departamento_id);
    }

    function admin_view_localidades_filtro($departamento_id = null) {
        $this->__aux_view_localidades_filtro($departamento_id);
    }

    /**
     * Busca las localidades de un determinado departamento o todas las localidades
     * @param <type> $departamento_id
     */
    function __aux_view_localidades_filtro($departamento_id = null) {
        $this->layout = false;
        $localidades = array();

        if (!empty($departamento_id)) {
            $localidades = $this->Localidade->find('list', array('conditions' => array('Localidade.departamento_id' => $departamento_id), 'fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));
        } else {
            $localidades = $this->Localidade->find('list', array('fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));
        }
        $localidades[0] = 'Todas';
        $this->set(compact('departamento_id', 'localidades'));
        $this->render('view_localidades_filtro');
    }

    function deshabilitar_obra($id = null) {
        $this->__aux_deshabilitar_obra($id);
    }

    function admin_deshabilitar_obra($id = null) {
        $this->__aux_deshabilitar_obra($id);
    }

    /**
     * Permite deshabilitar una obra de arte
     */
    function __aux_deshabilitar_obra($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('La obra no se ha podido deshabilitar.', true), 'flash_failure');
        }
        if (!empty($id)) {
            $this->Obra->id = $id;
            $obra = $this->Obra->read();
            $this->Obra->create();
            if (!empty($obra)) {
                $obra['Obra']['habilitada'] = 0;
                if ($this->Obra->save($obra['Obra'])) {
                    $this->Session->setFlash(__('La obra se deshabilitó correctamente.', true), 'flash_success');
                } else {
                    $this->Session->setFlash(__('La obra no se ha podido deshabilitar.', true), 'flash_failure');
                }
            }
        }
        $this->redirect(array('action' => 'admin_view_obras'));
    }

    function habilitar_obra($id = null) {
        $this->__aux_habilitar_obra($id);
    }

    function admin_habilitar_obra($id = null) {
        $this->__aux_habilitar_obra($id);
    }

    /**
     * Permite habilitar una obra de arte
     */
    function __aux_habilitar_obra($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('La obra no se ha podido habilitar.', true), 'flash_failure');
        }
        if (!empty($id)) {
            $this->Obra->id = $id;
            $obra = $this->Obra->read();
            $this->Obra->create();
            if (!empty($obra)) {
                $obra['Obra']['habilitada'] = 1;
                if ($this->Obra->save($obra['Obra'])) {
                    $this->Session->setFlash(__('La obra se habilitó correctamente.', true), 'flash_success');
                } else {
                    $this->Session->setFlash(__('La obra no se ha podido habilitar.', true), 'flash_failure');
                }
            }
        }
        $this->redirect(array('action' => 'admin_view_obras'));
    }

    function admin_advertencia($mensaje = null) {
        $this->__aux_advertencia($mensaje);
    }

    function advertencia($mensaje = null) {
        $this->__aux_advertencia($mensaje);
    }

    function __aux_advertencia($mensaje = null) {
        $this->set(compact('mensaje'));
        $this->render('advertencia');
    }

    function configuracion() {
        $this->__aux_configuracion();
    }

    function admin_configuracion() {
        $this->__aux_configuracion();
    }

    /**
     * Contiene la vista con las siguientes opciones de configuración del sistema:
     * - ABM de Localidades
     * - ABM de Rutas
     * - ABM de Zonas
     * - ABM de Obstáculos
     * - ABM de Elementos de Superestructura
     * - ABM de Elementos de Infraestructura
     * - ABM de Elementos de Señalización
     * - ABM de Materiales
     * - ABM de Indices de Estado
     * - ABM de Clases de Tránsito
     * - ABM de Tipos Estructurales
     */
    function __aux_configuracion() {
        if ($this->Session->check('id_obra'))
            $this->Session->delete('id_obra');

        if ($this->Session->check('id_evaluacione'))
            $this->Session->delete('id_evaluacione');

        if ($this->Session->check('id_intervencione'))
            $this->Session->delete('id_intervencione');
        
        $this->render('configuracion');
    }

    function edit_obra($obra_id = null) {
        $this->__aux_edit_obra($obra_id);
    }

    function admin_edit_obra($obra_id = null) {
        $this->__aux_edit_obra($obra_id);
    }

    /**
     * Contiene la vista con las solapas para editar una nueva obra de arte existente
     * @param <type> $obra_id
     */
    function __aux_edit_obra($obra_id = null) {
        $this->set(compact('obra_id'));
        $this->render('edit_obra');
    }

    function edit_datos_generales($obra_id = null) {
        $this->__aux_edit_datos_generales($obra_id);
    }

    function admin_edit_datos_generales($obra_id = null) {
        $this->__aux_edit_datos_generales($obra_id);
    }

    /**
     * Permite editar una nueva obra de arte (puente o alcantarilla) existente
     */
    function __aux_edit_datos_generales($obra_id = null) {
        $this->layout = false;

        $obrasTipos = $this->Obra->ObrasTipo->find('list', array('fields' => array('ObrasTipo.id', 'ObrasTipo.nombre'), 'order' => 'ObrasTipo.nombre'));
        $niveles = $this->Obra->Nivele->find('list', array('fields' => array('Nivele.id', 'Nivele.nivel_servicio'), 'order' => 'Nivele.nivel_servicio'));
        $zonas = $this->Obra->Zona->find('list', array('fields' => array('Zona.id', 'Zona.nombre'), 'order' => 'Zona.nombre'));
        $rutas = $this->Obra->Ruta->find('list', array('fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
        $obstaculos = $this->Obra->Obstaculo->find('list', array('fields' => array('Obstaculo.id', 'Obstaculo.nombre'), 'order' => 'Obstaculo.nombre'));
        $coordenada_x = '';
        $coordenada_y = '';
        $localidades = array();
        $departamentos = array();
        $departamento_id = '';
        $provincias = $this->Provincia->find('list', array('fields' => array('Provincia.id', 'Provincia.nombre'), 'order' => 'Provincia.nombre'));
        $provincia_id = '';
        $tramos = 0;
        $luz_total = 0;
        $tramos_obra = '';
        $tipos = array('Simple' => 'Simple', 'Mixto' => 'Mixto');
        $materiales = $this->Materiale->find('list', array('fields' => array('Materiale.id', 'Materiale.nombre'), 'order' => 'Materiale.nombre'));
        $tipos_estructurales = array();
        $clases_transitos = array();
        $clases_posicion = array('Lateral' => 'Lateral', 'Transversal' => 'Transversal');


        if (empty($this->data)) {
            if (!empty($obra_id)) {
                $this->Obra->recursive = 0;
                $this->Obra->id = $obra_id;
                $obra = $this->Obra->read();

                if (!empty($obra)) {
                    $this->data = $obra;

                    $departamento_id = $this->data['Localidade']['departamento_id'];
                    $localidades = $this->Obra->Localidade->find('list', array('conditions' => array('Localidade.departamento_id' => $departamento_id), 'fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));

                    $this->Departamento->recursive = -1;
                    $provincia = $this->Departamento->findById($departamento_id);
                    if (!empty($provincia)) {
                        $provincia_id = $provincia['Departamento']['provincia_id'];
                        $departamentos = $this->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id), 'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
                    }

                    $x = $this->Obra->query('SELECT X(AsText(obra_geom)) FROM obras WHERE id=' . $obra_id . ';');
                    $y = $this->Obra->query('SELECT Y(AsText(obra_geom)) FROM obras WHERE id=' . $obra_id . ';');
                    $coordenada_x = (!empty($x)) ? $x[0][0]['x'] : '';
                    $coordenada_y = (!empty($y)) ? $y[0][0]['y'] : '';

                    $this->Tramo->recursive = -1;
                    $set_tramos = $this->Tramo->find('all', array('conditions' => array('Tramo.obra_id' => $obra_id)));
                    if (!empty($set_tramos)) {
                        $tramos = count($set_tramos);
                        foreach ($set_tramos as $key => $tramo) {
                            $luz_total += $tramo['Tramo']['luz_parcial'];
                            $tramos_obra .= "<div id='div_" . $key . "' name='div_" . $key . "'><label>Luz Parcial Tramo " . $key . "</label><input id='tramo_" . $key . "' name='data[Tramo][tramo_" . $key . "]' value='" . $tramo['Tramo']['luz_parcial'] . "' onchange='convertiraFloat(this); sumarLongitudTotal();'></div>";
                        }
                    }

                    $tipos_estructurales = $this->Obra->TiposEstructurale->find('list', array('conditions' => array('TiposEstructurale.obras_tipo_id' => $this->data['ObrasTipo']['id']), 'fields' => array('TiposEstructurale.id', 'TiposEstructurale.nombre'), 'order' => 'TiposEstructurale.nombre'));
                    $clases_transitos = $this->Obra->ClasesTransito->find('list', array('conditions' => array('ClasesTransito.obras_tipo_id' => $this->data['ObrasTipo']['id']), 'fields' => array('ClasesTransito.id', 'ClasesTransito.nombre'), 'order' => 'ClasesTransito.nombre'));
                }
            }
        } else {//Se modificaron los datos generales de la obra de arte
            $this->__save_datos_generales($this->data);
        }
        $referer = $this->referer();
        $this->set(compact('obrasTipos', 'niveles', 'zonas', 'rutas', 'obstaculos', 'localidades', 'departamentos', 'provincias', 'tipos', 'materiales', 'tipos_estructurales', 'clases_transitos', 'clases_posicion'));
        $this->set(compact('coordenada_x', 'coordenada_y', 'departamento_id', 'provincia_id', 'tramos', 'luz_total', 'tramos_obra', 'referer'));
        $this->render('edit_datos_generales');
    }

    function __save_datos_generales($data = null) {
        if (!empty($data)) {

            $this->Obra->begin();
            $codigo_identificacion_obra = '';
            //Verifico si el código de identificación de la obra ya existe
            if (isset($data['Obra']['id']) && (!empty($data['Obra']['id']))) {
                $codigo_identificacion_obra = $this->Obra->find('all', array('conditions' => array('Obra.id <>' => $data['Obra']['id'], 'Obra.codigo_identificacion' => $data['Obra']['codigo_identificacion'])));
            } else {
                $codigo_identificacion_obra = $this->Obra->findByCodigoIdentificacion($data['Obra']['codigo_identificacion']);
            }

            if (empty($codigo_identificacion_obra)) {

                //Verifico si el nombre de la obra ya existe
                $nombre_obra = '';
                if (isset($data['Obra']['nombre']) && (!empty($data['Obra']['nombre']))) {
                    if (isset($data['Obra']['id']) && (!empty($data['Obra']['id']))) {
                        $nombre_obra = $this->Obra->find('all', array('conditions' => array('Obra.id <>' => $data['Obra']['id'], 'Obra.nombre' => $data['Obra']['nombre'])));
                    } else {
                        $nombre_obra = $this->Obra->findByNombre($data['Obra']['nombre']);
                    }
                }

                if (empty($nombre_obra)) {

                    $this->Obra->create();
                    if (!empty($data['MaterialesTipo'])) {
                        $this->Obra->MaterialesTipo->save($data['MaterialesTipo']);
                        $id_materiales_tipo = $this->Obra->MaterialesTipo->id;
                    }

                    if (!empty($data['DatosConstruccione'])) {
                        list($dia, $mes, $anio) = explode('/', $data['DatosConstruccione']['fecha_proyecto']);
                        $data['DatosConstruccione']['fecha_proyecto'] = date("Y-m-d H:i:s", strtotime(date($mes . '/' . $dia . '/' . $anio)));
                        list($dia, $mes, $anio) = explode('/', $data['DatosConstruccione']['fecha_inicio']);
                        $data['DatosConstruccione']['fecha_inicio'] = date("Y-m-d H:i:s", strtotime(date($mes . '/' . $dia . '/' . $anio)));
                        list($dia, $mes, $anio) = explode('/', $data['DatosConstruccione']['fecha_fin']);
                        $data['DatosConstruccione']['fecha_fin'] = date("Y-m-d H:i:s", strtotime(date($mes . '/' . $dia . '/' . $anio)));
                        list($dia, $mes, $anio) = explode('/', $data['DatosConstruccione']['fecha_habilitacion']);
                        $data['DatosConstruccione']['fecha_habilitacion'] = date("Y-m-d H:i:s", strtotime(date($mes . '/' . $dia . '/' . $anio)));

                        $this->Obra->DatosConstruccione->save($data['DatosConstruccione']);
                        $id_datos_construcciones = $this->Obra->DatosConstruccione->id;
                    }

                    if ((!empty($id_materiales_tipo)) && (!empty($id_datos_construcciones))) {
                        $data['Obra']['habilitada'] = 1;
                        $data['Obra']['fecha_alta'] = date("Y-m-d H:i:s");
                        $data['Obra']['fecha_actualizacion'] = date("Y-m-d H:i:s");
                        $data['Obra']['fecha_baja'] = date("Y-m-d H:i:s");
                        $data['Obra']['materiales_tipo_id'] = $id_materiales_tipo;
                        $data['Obra']['datos_construccione_id'] = $id_datos_construcciones;

                        unset($data['Obra']['provincia_id']);
                        unset($data['Obra']['departamento_id']);
                        unset($data['Obra']['cantidad_tramos']);

                        if ($this->Obra->save($data['Obra'])) {
                            $id_obra = $this->Obra->id;
                            $this->Tramo->deleteAll(array('Tramo.obra_id' => $id_obra));
                            if (!empty($data['Tramo'])) {
                                $tramos = $data['Tramo'];
                                foreach ($tramos as $tramo):
                                    $registro_tramo = array();
                                    $registro_tramo['Tramo']['luz_parcial'] = $tramo;
                                    $registro_tramo['Tramo']['obra_id'] = $id_obra;
                                    $this->Tramo->create($registro_tramo);
                                    $this->Tramo->save($registro_tramo);
                                endforeach;

                                if (!empty($data['Coordenada'])) {
                                    $x = $data['Coordenada']['x'];
                                    $y = $data['Coordenada']['y'];
                                    $colum_geom = $this->Obra->query("UPDATE obras SET obra_geom = geomfromtext('POINT(" . $x . " " . $y . ")', 22185) WHERE id = " . $id_obra . ";");

                                    $this->Obra->commit();
                                    $this->Session->write('id_obra', $id_obra);
                                    echo 'La obra de arte se guardó correctamente.';
                                    exit;
                                } else {
                                    $this->Obra->rollback();
                                    echo 'La obra no se ha podido guardar. Revise las coordenadas geométricas.';
                                    exit;
                                }
                            } else {
                                $this->Obra->rollback();
                                echo 'La obra no se ha podido guardar. Especifique correctamente los tramos de la obra.';
                                exit;
                            }
                        } else {
                            $this->Obra->rollback();
                            echo 'La obra no se ha podido guardar. Por favor, intente nuevamente.';
                            exit;
                        }
                    } else {
                        $this->Obra->rollback();
                        echo 'La obra no se ha podido guardar, porque no se pudieron guardar los Materiales y/o Datos de Construcción. Por favor, intente nuevamente.';
                        exit;
                    }
                } else {
                    $this->Obra->rollback();
                    echo 'El nombre ingresado ya existe.';
                    exit;
                }
            } else {
                $this->Obra->rollback();
                echo 'El código de identificación ingresado ya existe.';
                exit;
            }
        }
    }

    //********************************************//
    //***************** MAPA *********************//
    //********************************************//

    function admin_mapa() {
        //$this->layout = 'mapa';

        if ($this->Session->check('id_obra'))
            $this->Session->delete('id_obra');

        if ($this->Session->check('id_evaluacione'))
            $this->Session->delete('id_evaluacione');

        if ($this->Session->check('id_intervencione'))
            $this->Session->delete('id_intervencione');

        $niveles = $this->Obra->Nivele->find('list', array('fields' => array('Nivele.id', 'Nivele.nivel_servicio')));
        $estados = $this->Obra->Nivele->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre')));
        $obras_tipos = $this->Obra->ObrasTipo->find('list', array('fields' => array('ObrasTipo.id', 'ObrasTipo.nombre')));
        $obras_tipos['0'] = 'Todas';
        $provincias = $this->Provincia->find('list', array('fields' => array('Provincia.id', 'Provincia.nombre')));
        $tipos_zonas = $this->ZonasTipo->find('list', array('fields' => array('ZonasTipo.id', 'ZonasTipo.nombre')));
        $tipos_zonas['0'] = 'Todos';
        $tipos_rutas = $this->RutasTipo->find('list', array('fields' => array('RutasTipo.id', 'RutasTipo.nombre')));
        $tipos_rutas['0'] = 'Todos';
        $tipologias = $this->TipologiasViale->find('list', array('fields' => array('TipologiasViale.id', 'TipologiasViale.nombre')));
        $tipologias['0'] = 'Todas';
        $tipos_obstaculos = $this->ObstaculosTipo->find('list', array('fields' => array('ObstaculosTipo.id', 'ObstaculosTipo.nombre')));
        $tipos_obstaculos['0'] = 'Todos';
        $tipos = array('Simple' => 'Simple', 'Mixto' => 'Mixto');
        $materiales = $this->Materiale->find('list', array('fields' => array('Materiale.id', 'Materiale.nombre')));

        $this->set(compact('niveles', 'estados', 'obras_tipos', 'provincias', 'tipos_zonas', 'tipos_rutas', 'tipologias', 'tipos_obstaculos', 'tipos', 'materiales'));
    }

    function view_tipologias_mapa($id_tipo_obra = null) {
        $this->__aux_view_tipologias_mapa($id_tipo_obra);
    }

    function admin_view_tipologias_mapa($id_tipo_obra = null) {
        $this->__aux_view_tipologias_mapa($id_tipo_obra);
    }

    /**
     *
     * @param <type> $id_tipo_obra
     */
    function __aux_view_tipologias_mapa($id_tipo_obra = null) {
        $this->layout = false;
        $tipos_estructurales = array();
        $clases_transitos = array();
        $clases_posicion = array();

        if (!empty($id_tipo_obra)) {
            $tipos_estructurales = $this->Obra->TiposEstructurale->find('list', array('conditions' => array('TiposEstructurale.obras_tipo_id' => $id_tipo_obra),
                        'fields' => array('TiposEstructurale.id', 'TiposEstructurale.nombre')));

            $clases_transitos = $this->Obra->ClasesTransito->find('list', array('conditions' => array('ClasesTransito.obras_tipo_id' => $id_tipo_obra),
                        'fields' => array('ClasesTransito.id', 'ClasesTransito.nombre')));

            if ($id_tipo_obra == 2) {
                $clases_posicion = array('Lateral' => 'Lateral', 'Transversal' => 'Transversal');
            }
        }
        $this->set(compact('id_tipo_obra', 'tipos_estructurales', 'clases_transitos', 'clases_posicion'));
        $this->render('view_tipologias_mapa');
    }

    function view_departamentos_mapa($id_provincia = null) {
        $this->__aux_view_departamentos_mapa($id_provincia);
    }

    function admin_view_departamentos_mapa($id_provincia = null) {
        $this->__aux_view_departamentos_mapa($id_provincia);
    }

    /**
     *
     * @param <type> $id_provincia
     */
    function __aux_view_departamentos_mapa($id_provincia = null) {
        $this->layout = false;
        $departamentos = array();
        if (!empty($id_provincia)) {
            $departamentos = $this->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $id_provincia),
                        'fields' => array('Departamento.id', 'Departamento.nombre')));
        }
        $this->set('departamentos', $departamentos);
        $this->render('view_departamentos_mapa');
    }

    function view_localidades_mapa($id_departamento = null) {
        $this->__aux_view_localidades_mapa($id_departamento);
    }

    function admin_view_localidades_mapa($id_departamento = null) {
        $this->__aux_view_localidades_mapa($id_departamento);
    }

    /**
     *
     * @param <type> $id_departamento
     */
    function __aux_view_localidades_mapa($id_departamento = null) {
        $this->layout = false;
        $localidades = array();
        if (!empty($id_departamento)) {
            $localidades = $this->Localidade->find('list', array('conditions' => array('Localidade.departamento_id' => $id_departamento),
                        'fields' => array('Localidade.id', 'Localidade.nombre')));
        }
        $this->set('localidades', $localidades);
        $this->render('view_localidades_mapa');
    }

}
?>